﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL;
using FrameworkLib.Facades;

namespace GestionePolveriLib.Facades
{
    [Serializable]
    public class ColoriFacade : FacadeBase<GestionePolveriEntities>
    {
        private string sequenzaNomi = string.Empty;
        GestionePolveriEntities context = null;

        public ColoriFacade()
        {
            context = this.GetContext();
        }

        public ColoriFacade(string connectionString)
        {
            context = this.GetContext(connectionString);
        }

        public void LoadAsync(BackgroundWorkerCallbackBase.Callback callback)
        {
            this.RunAsync(() => GetAll(), callback);
        }

        public List<Colore> GetAll()
        {
            List<Colore> retValue = null;

            //Applicazione = (from a in x.ComposizioneColori where a.IDColore == x.IDColore select a.Applicazione).Join(x => x),
            try
            {
                var obj = from x in context.AnagColori
                          select new Colore
                          {
                              Applicazione = "",
                              ID = x.IDColore,
                              CodiceColore = x.CodiceColore,
                              Descrizione = x.Descrizione,
                              Note = x.Note,
                              Famiglia = (from y in context.AnagFamiglie
                                          where y.IDFamiglia == x.IDFamiglia
                                          select new FamigliaColore
                                          {
                                              ID = y.IDFamiglia,
                                              Descrizione = y.Descrizione
                                          }).FirstOrDefault()
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();

                    List<LookUp_FamiglieColori_ColoriAbbinati_Result> mmm = (List<LookUp_FamiglieColori_ColoriAbbinati_Result>)FrameworkLib.Utilities.Singleton<GestionePolveriLib.Cache.LookUpData>.Instance.GetData("LookupFamiglie");
                    foreach (Colore p in retValue)
                    {
                        LookUp_FamiglieColori_ColoriAbbinati_Result r = null;
                        r = mmm.Find(x => (x.ColoriAbbinati == null ? false : x.ColoriAbbinati.Contains(p.CodiceColore)));
                        if (r != null)
                        {
                          p.Applicazione = r.Applicazione;
                        }
                    }

                    //ComposizioneColoreFacadeExt ccfext = new ComposizioneColoreFacadeExt();
                    //foreach (Colore c in retValue)
                    //{
                    //    c.Applicazione = ccfext.GetApplicazioneColore(c.ID);
                    //}
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        private string Aggiungi(string a)
        {
            return sequenzaNomi += a;
        }

        public bool Add(Colore data)
        {
            bool retValue = false;

            try
            {
                if (!context.AnagColori.Any(x => x.CodiceColore == data.CodiceColore))
                {
                    AnagColori imp = new AnagColori();
                    imp.CodiceColore = data.CodiceColore;
                    imp.Descrizione = data.Descrizione;
                    imp.Note = data.Note;
                    imp.IDFamiglia = data.Famiglia.ID;

                    context.AnagColori.AddObject(imp);
                    context.SaveChanges();

                    data.ID = imp.IDColore;

                    retValue = true;
                }
                else
                {
                    AnagColori imp = context.AnagColori.FirstOrDefault(x => x.CodiceColore == data.CodiceColore);
                    if (imp != null)
                    {
                        data.CodiceColore = imp.CodiceColore;
                        data.Descrizione = imp.Descrizione;
                        data.Note = imp.Note;
                        data.Famiglia.ID = imp.IDFamiglia;
                    }
                }

                retValue = true;
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public bool Delete(Colore data)
        {
            bool retValue = false;

            try
            {
                var obj = from x in context.AnagColori
                          where x.IDColore == data.ID
                          select x;

                if (obj.Any())
                {
                    AnagColori m_colore = (AnagColori)obj.FirstOrDefault();

                    var obj2 = from x in context.StoricoNomiColori where x.IDColore == m_colore.IDColore select x;
                    if (obj2.Any())
                    {
                        List<StoricoNomiColori> m_nomiColori = (List<StoricoNomiColori>)obj2.ToList();
                        foreach (StoricoNomiColori sn in m_nomiColori)
                        {
                            context.StoricoNomiColori.DeleteObject(sn);
                        }
                    }
                    
                    context.AnagColori.DeleteObject(m_colore);
                    context.SaveChanges();

                    retValue = true;

                }
            }
            catch (Exception ex)
            {
                //throw ex;
            }

            return retValue;
        }

        public bool Modify(Colore data)
        {
            bool retValue = false;

            try
            {
                var obj = from x in context.AnagColori
                          where x.IDColore == data.ID
                          select x;

                if (obj.Any())
                {
                    Transact(() =>
                    {
                        AnagColori imp = obj.FirstOrDefault();

                        imp.Descrizione = data.Descrizione;
                        imp.Note = data.Note;
                        imp.IDFamiglia = data.Famiglia.ID;

                        if (imp.CodiceColore != data.CodiceColore)
                        {
                            StoricoNomiColori snc = new StoricoNomiColori();
                            snc.DataModifica = DateTime.Now;
                            snc.IDColore = imp.IDColore;
                            snc.Nome = imp.CodiceColore;

                            context.StoricoNomiColori.AddObject(snc);

                            imp.CodiceColore = data.CodiceColore;
                        }

                        context.SaveChanges();

                        retValue = true;
                    });
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public Colore Get(int id)
        {
            Colore retValue = null;

            try
            {
                var obj = from x in context.AnagColori
                          where x.IDColore == id
                          select new Colore
                          {
                              ID = x.IDColore,
                              Descrizione = x.Descrizione,
                              CodiceColore = x.CodiceColore,
                              Note = x.Note,
                              Famiglia = (from y in context.AnagFamiglie
                                          where y.IDFamiglia == x.IDFamiglia
                                          select new FamigliaColore
                                          {
                                              ID = y.IDFamiglia,
                                              Descrizione = y.Descrizione
                                          }).FirstOrDefault()
                          };

                if (obj.Any())
                {
                    retValue = obj.FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public Colore Get(string codiceColore)
        {
            Colore retValue = null;

            try
            {
                var obj = from x in context.AnagColori
                          where x.CodiceColore == codiceColore
                          select new Colore
                          {
                              ID = x.IDColore,
                              Descrizione = x.Descrizione,
                              CodiceColore = x.CodiceColore,
                              Note = x.Note,
                              Famiglia = (from y in context.AnagFamiglie
                                          where y.IDFamiglia == x.IDFamiglia
                                          select new FamigliaColore
                                          {
                                              ID = y.IDFamiglia,
                                              Descrizione = y.Descrizione
                                          }).FirstOrDefault()
                          };

                if (obj.Any())
                {
                    retValue = obj.FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public string[] GetStoricoNomi(int idColore)
        {
            string[] retValue = null;

            try
            {
                var obj = from x in context.StoricoNomiColori
                          where x.IDColore == idColore
                          select x.Nome;

                if (obj.Any())
                {
                    retValue = obj.ToArray();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public List<Colore> GetAllEssential()
        {
            List<Colore> retValue = null;

            try
            {
                var obj = from x in context.AnagColori
                          select new Colore
                          {
                              ID = x.IDColore,
                              CodiceColore = x.CodiceColore,
                              Descrizione = x.Descrizione,
                              Note = x.Note,
                              Famiglia = (from y in context.AnagFamiglie
                                          where y.IDFamiglia == x.IDFamiglia
                                          select new FamigliaColore { 
                                              ID = y.IDFamiglia,
                                              Descrizione = y.Descrizione
                                          }).FirstOrDefault()
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }
    }
}
